// 用户相关的处理逻辑代码
package controllers

import (
	"bluebell/dao/mysql"
	"bluebell/logic"
	"bluebell/models"
	"errors"
	"fmt"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// 注册
func SignUpHandler(c *gin.Context) {
	// 1. 获取请求参数与校验
	p := new(models.ParamSignUp)
	if errMsg := validatorParams(c, p); errMsg != "" {
		ResponseErrorWithMsg(c, CodeInvalidParam, errMsg)
		return
	}
	fmt.Println(*p)
	// 2. 业务处理
	if err := logic.Sign(p); err != nil {
		zap.L().Error("controllers/user/SignUp.Sign()", zap.Error(err))
		// 判断是否是用户已存在的错误.
		// 使用 switch 语句，代替id else 减少大量的使用 return
		switch {
		case errors.Is(err, mysql.ErrorUserExist):
			ResponseError(c, CodeUserExist)
		default:
			ResponseError(c, CodeServerBusy)
		}
		return
	}
	// 3. 返回响应
	ResponseSuccess(c, nil)
}

// 登录
func LoginHandler(c *gin.Context) {
	// 1. 获取请求参数与校验
	p := new(models.ParamsLogin)
	if errMsg := validatorParams(c, p); errMsg != "" {
		ResponseErrorWithMsg(c, CodeInvalidParam, errMsg)
		return
	}
	// 2. 逻辑处理
	user, token, err := logic.Login(p)
	if err != nil {
		zap.L().Error("controllers/user/Login", zap.Error(err))
		// 判断是那种错误
		switch {
		case errors.Is(err, mysql.ErrorUserNotExist):
			ResponseError(c, CodeUserNotExist)
		case errors.Is(err, mysql.ErrorInvalidPassword):
			ResponseError(c, CodeInvalidPassword)
		default: // 排除上面俩，默认就是 token的错误问题了
			ResponseError(c, CodeInvalidPassword)
		}
		return
	}
	// 3. 返回响应
	ResponseSuccess(c, gin.H{
		"token": token,
		// 转换为字符串，防止失真，前端能表示的整数范围是 1 << 53 -1, 而int64要超过这个大小
		"user_id":   fmt.Sprintf("%d", user.UserID),
		"user_name": user.Username,
	})
}
